package com.artisan.springuitls.demos;

import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * Base64 编解码演示
 * 功能：Base64 编解码专家
 * 说明：使用 Java 标准库的 Base64（JDK 8+），Spring 6.x 已移除 Base64Utils
 */
@Component
public class Base64UtilsDemo {

    /**
     * 场景：图片转 Base64 嵌入 HTML
     */
    public String encodeImage(byte[] imageBytes) {
        System.out.println("\n========== Base64 Demo ==========");
        
        // ✅ 一行编码
        String base64 = Base64.getEncoder().encodeToString(imageBytes);
        System.out.println("✓ 图片 Base64（前50字符）: " + 
            base64.substring(0, Math.min(50, base64.length())) + "...");
        return base64;
    }

    /**
     * 演示基础编解码操作
     */
    public void demonstrateBasicOperations() {
        System.out.println("\n--- 基础编解码操作 ---");
        
        // 1. 字符串编码
        String text = "Hello, Spring Boot! 你好，世界！";
        byte[] encoded = Base64.getEncoder().encode(text.getBytes(StandardCharsets.UTF_8));
        System.out.println("✓ 编码后字节长度: " + encoded.length);
        
        // 2. 字符串编码（返回 String）
        String encodedStr = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
        System.out.println("✓ Base64 编码: " + encodedStr);
        
        // 3. 字符串解码
        byte[] decoded = Base64.getDecoder().decode(encoded);
        String decodedStr = new String(decoded, StandardCharsets.UTF_8);
        System.out.println("✓ 解码后文本: " + decodedStr);
        
        // 4. 从字符串解码
        byte[] decodedFromStr = Base64.getDecoder().decode(encodedStr);
        System.out.println("✓ 从 String 解码: " + new String(decodedFromStr, StandardCharsets.UTF_8));
        
        System.out.println();
    }

    /**
     * 演示 URL 安全编解码
     */
    public void demonstrateUrlSafeEncoding() {
        System.out.println("\n--- URL 安全编解码 ---");
        
        // 标准 Base64 可能包含 +、/、= 字符，不适合 URL
        // URL 安全 Base64 使用 -、_ 替代 +、/，并可省略 =
        
        String text = "user=admin&token=abc123!@#";
        
        // 1. URL 安全编码
        byte[] urlSafeEncoded = Base64.getUrlEncoder().encode(text.getBytes(StandardCharsets.UTF_8));
        String urlSafeStr = new String(urlSafeEncoded, StandardCharsets.UTF_8);
        System.out.println("✓ URL 安全编码: " + urlSafeStr);
        
        // 2. URL 安全编码（返回 String）
        String urlSafeEncodedStr = Base64.getUrlEncoder().encodeToString(
            text.getBytes(StandardCharsets.UTF_8));
        System.out.println("✓ URL 安全编码(String): " + urlSafeEncodedStr);
        
        // 3. URL 安全解码
        byte[] urlSafeDecoded = Base64.getUrlDecoder().decode(urlSafeEncoded);
        System.out.println("✓ URL 安全解码: " + new String(urlSafeDecoded, StandardCharsets.UTF_8));
        
        // 4. 从字符串解码
        byte[] decodedFromStr = Base64.getUrlDecoder().decode(urlSafeEncodedStr);
        System.out.println("✓ 从 String 解码: " + new String(decodedFromStr, StandardCharsets.UTF_8));
        
        System.out.println();
    }

    /**
     * 实际应用场景：JWT Token 模拟
     */
    public void demonstrateJwtSimulation() {
        System.out.println("\n--- JWT Token 模拟 ---");
        
        // JWT 由三部分组成：header.payload.signature
        String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
        String payload = "{\"sub\":\"1001\",\"name\":\"张三\",\"exp\":1234567890}";
        
        // 使用 URL 安全 Base64 编码
        String encodedHeader = Base64.getUrlEncoder().withoutPadding()
            .encodeToString(header.getBytes(StandardCharsets.UTF_8));
        String encodedPayload = Base64.getUrlEncoder().withoutPadding()
            .encodeToString(payload.getBytes(StandardCharsets.UTF_8));
        
        System.out.println("✓ Header: " + encodedHeader);
        System.out.println("✓ Payload: " + encodedPayload);
        System.out.println("✓ 模拟 JWT: " + encodedHeader + "." + encodedPayload + ".signature");
        
        // 解码验证
        String decodedHeader = new String(
            Base64.getUrlDecoder().decode(encodedHeader), 
            StandardCharsets.UTF_8);
        String decodedPayload = new String(
            Base64.getUrlDecoder().decode(encodedPayload), 
            StandardCharsets.UTF_8);
        
        System.out.println("✓ 解码 Header: " + decodedHeader);
        System.out.println("✓ 解码 Payload: " + decodedPayload);
        
        System.out.println();
    }

    /**
     * 演示图片 Base64 场景
     */
    public void demonstrateImageEncoding() {
        System.out.println("\n--- 图片 Base64 场景 ---");
        
        // 模拟图片数据（实际应用中从文件读取）
        byte[] fakeImageData = "假装这是图片的二进制数据".getBytes(StandardCharsets.UTF_8);
        
        String base64Image = Base64.getEncoder().encodeToString(fakeImageData);
        
        // 嵌入 HTML
        String htmlImg = String.format(
            "<img src='data:image/png;base64,%s' alt='示例图片' />", 
            base64Image);
        
        System.out.println("✓ HTML 图片标签:");
        System.out.println(htmlImg);
        
        System.out.println();
    }

    /**
     * 版本说明
     */
    public void printVersionInfo() {
        System.out.println("\n--- 版本说明 ---");
        
        System.out.println("✓ Spring Base64Utils:");
        System.out.println("   - Spring 5.x 及更早版本提供");
        System.out.println("   - Spring 6.x 已移除");
        System.out.println("");
        System.out.println("✓ Java Base64:");
        System.out.println("   - 位置：java.util.Base64");
        System.out.println("   - 要求：Java 8+");
        System.out.println("   - API：Base64.getEncoder().encodeToString()");
        System.out.println("");
        System.out.println("✓ 推荐：统一使用 JDK 标准 Base64");
        
        System.out.println("==========================================\n");
    }
}
